Skip to content
bash
docker-compose -f docker-compose-infra.yaml up -d

是专门用来启动基础设施服务(Infrastructure)的,比如 MySQL、Redis、Nginx、MinIO 等第三方服务。这些服务基本都是用官方镜像或者项目里预定义好的镜像,几乎不涉及你自己写的应用代码。

所以你问“为什么要 --build”,答案很简单:

在启动 infra(基础设施)的时候,基本不需要加 --build。

具体解释:

  • --build 的作用是:强制重新构建 docker-compose.yml(或 infra.yaml)里定义的镜像

  • 在你的

    docker-compose-infra.yaml

    里,大部分服务应该是这样的写法:

    yaml
    mysql:
      image: mysql:8.0      # 直接用官方镜像
      # 没有 build: ./xxx 这一行
    
    redis:
      image: redis:7-alpine # 直接用官方镜像

    这些服务

    没有自定义镜像

    ,直接拉取 Docker Hub 的现成镜像,所以第一次运行会自动拉取镜像,之后再 up 就直接启动容器,根本不需要 build。

  • 只有当某个服务有 build: 配置时(比如你自己写的 api 服务),才需要 --build 来重新编译打包。

所以你现在正确的命令就是:

bash
docker compose -f docker-compose-infra.yaml up -d

不要加 --build,加了反而会白白浪费时间(它会去检查有没有需要 build 的服务,发现没有就跳过,但多此一举)。

常见问题:

Q:

目前 docker-compose-infra.yaml 只负责启动第三方基础设施(MySQL、Redis 等),用的是官方镜像,所以不需要 --build。

但你后续计划把自己的应用服务(APP、API 等)也加进这个 infra.yaml 文件里,或者干脆合并成一个 compose 文件。

而且你的应用服务是用自己构建的镜像(比如 Dockerfile 构建的 tour-mate-platform-app、api 等),所以到时候启动时必须加 --build,不然改了代码不会生效。

Q:

拉完镜像后,重新 up -d 会不会又重新下载镜像? 不会! Docker 的机制是:本地一旦拉取成功并存在镜像,就不会再重复下载(除非你手动 docker pull 或者加 --no-cache --pull 之类的强制参数)。 你现在看到的拉取过程只发生这一次,拉完之后,以后每次执行

bash
docker compose -f docker-compose-infra.yaml up -d

都会直接跳过 Pulling,直接 Creating/Starting 容器,速度飞快(几秒钟的事)。

Q:

JAVA_OPTS 格式问题会导致容器启动失败吗? 不会导致启动失败,只会继续出那些 WARNING。

  • 这些 WARNING 纯粹是 Docker Compose 在解析 .env 文件时吐的槽(因为它用 python-dotenv 不支持 \ 续行)。
  • 但解析完后,它还是会把 JAVA_OPTS 的值完整传给容器(只是可能把续行后的部分当成单独变量忽略,但你目前 infra.yaml 里根本没用到 JAVA_OPTS)。
  • 你的 docker-compose-infra.yaml 只启动基础设施(MySQL、Redis、RabbitMQ 等),根本不涉及 Java 应用服务,所以 JAVA_OPTS 这个变量现在完全没被用到,自然不会报错。

等你以后启动应用服务(比如 tour-mate-platform-api 或 app)时,如果那个 compose 文件里有用到 JAVA_OPTS,才可能在容器内部出问题(JVM 参数不全)。到时候我们再改成单行就行,现在完全不用急。

Q:

官方镜像拉不到,不好使怎么办

bash
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://dockerproxy.com",
    "https://docker.1panel.live",
    "https://docker.nju.edu.cn",
    "https://docker.xuanyuan.me",       
    "https://hub.rat.dev",             
    "https://mirror.baidubce.com"      
  ]
}

sudo nano /etc/docker/daemon.json

sudo systemctl daemon-reload
sudo systemctl restart docker


docker info | grep -A 5 Mirrors

常见使用:

清理旧容器 + 重新启动

bash
docker compose -f docker-compose-infra.yaml down
docker volume rm docker_mysql-slave-data  # 可选:如果想重新初始化数据卷
docker compose -f docker-compose-infra.yaml up -d
bash
[root@lavm-mrwx0i4yq6 docker]# ls
docker-compose-app.yaml  docker-compose-infra.yaml  monitoring  mysql  rabbitmq  redis  wukongim
[root@lavm-mrwx0i4yq6 docker]# docker-compose -f docker-compose-infra.yaml stop mysql-slave
[root@lavm-mrwx0i4yq6 docker]# docker-compose -f docker-compose-infra.yaml rm mysql-slave
Going to remove tour-mate-mysql-slave
Are you sure? [yN] y
Removing tour-mate-mysql-slave ... done
[root@lavm-mrwx0i4yq6 docker]# docker-compose -f docker-compose-infra.yaml up -d --force-recreate mysql-slave
Recreating tour-mate-mysql-master ... done
Creating tour-mate-mysql-slave    ... done
[root@lavm-mrwx0i4yq6 docker]# docker-compose -f docker-compose-infra.yaml ps | grep slave
tour-mate-mysql-slave      /bin/sh -c exec /docker-en ...   Restarting                                                                                                                                                                                                                     
[root@lavm-mrwx0i4yq6 docker]# docker logs -f tour-mate-mysql-slave
bash
# 注意这个mysql-slave是 docker-compose-infra.yaml 中的标识,就是通过这个标识找到对应的镜像配置
# 其实最简单的就是通过 docker stop container_name ,docker rm container_name 这两个命令效果一样
docker compose -f docker-compose-infra.yaml stop mysql-slave
docker compose -f docker-compose-infra.yaml rm mysql-slave
bash
#重新构建: 比如改了镜像的版本,然后就会重新去构建新版本的镜像,在此之前先把之前的容器 docker stop container_name, docker rm container_name. 注意mysql-exporter是 docker-compose.yml的标志识别,不是 container_name, 通过 docker compose命令 去操作容器就是docker-compose-infra.yaml中的标识,通过 docker 命令去操作就是 container_name
docker compose -f docker-compose-infra.yaml up -d --force-recreate mysql-exporter

# 执行上面命令会出现,这是在重新下载镜像
Pulling mysql-exporter (prom/mysqld-exporter:v0.14.0)...
v0.14.0: Pulling from prom/mysqld-exporter
009932687766: Pull complete
ff9264fbb6f4: Pull complete
1516dd896e5e: Pull complete
Digest: sha256:eb6fe170738bf9181c51f5bc89f93adb26672ec49ffdcb22f55c24834003b45d
Status: Downloaded newer image for prom/mysqld-exporter:v0.14.0
Recreating tour-mate-mysql-master ... done
Creating tour-mate-mysql-exporter ... done

Powered by VitePress